BemÀstra JavaScripts nullish coalescing-operator (??) för renare och effektivare tilldelning av standardvÀrden. LÀr dig hur den skiljer sig frÄn OR-operatorn (||) och se praktiska exempel.
JavaScript Nullish Coalescing: En Omfattande Guide till Tilldelning av StandardvÀrden
I JavaScript Àr det en vanlig uppgift att tilldela standardvÀrden. Traditionellt har utvecklare anvÀnt OR-operatorn (||
) för detta ÀndamÄl. Men nullish coalescing-operatorn (??
), som introducerades i ECMAScript 2020, erbjuder ett mer precist och tillförlitligt sÀtt att hantera tilldelning av standardvÀrden, sÀrskilt nÀr man hanterar null
- eller undefined
-vÀrden. Denna guide ger en djupdykning i nullish coalescing-operatorn, och utforskar dess syntax, beteende, skillnader frÄn OR-operatorn och praktiska anvÀndningsfall.
Vad Àr Nullish Coalescing?
Nullish coalescing-operatorn (??
) Àr en logisk operator som returnerar sin högra operand nÀr dess vÀnstra operand Àr null
eller undefined
. Annars returnerar den sin vÀnstra operand. Enkelt uttryckt tillhandahÄller den ett standardvÀrde endast nÀr en variabel Àr strikt null
eller undefined
.
Syntax
Syntaxen för nullish coalescing-operatorn Àr enkel:
leftOperand ?? rightOperand
HÀr Àr leftOperand
variabeln eller uttrycket du vill kontrollera för null
eller undefined
, och rightOperand
Àr standardvÀrdet du vill tilldela om leftOperand
faktiskt Àr null
eller undefined
.
Exempel
TÀnk pÄ följande exempel:
const username = null ?? "Guest";
console.log(username); // Output: Guest
const age = undefined ?? 25;
console.log(age); // Output: 25
const city = "London" ?? "Unknown";
console.log(city); // Output: London
I detta exempel tilldelas username
standardvÀrdet "Guest" eftersom det ursprungligen Àr null
. PÄ samma sÀtt tilldelas age
vÀrdet 25 eftersom det börjar som undefined
. DÀremot behÄller city
sitt ursprungliga vÀrde, "London", eftersom det varken Àr null
eller undefined
.
Nullish- vs. Falsy-vÀrden
Det Àr avgörande att förstÄ skillnaden mellan nullish- och falsy-vÀrden i JavaScript. Ett nullish-vÀrde Àr antingen null
eller undefined
. Ett falsy-vÀrde Àr ett vÀrde som betraktas som falskt nÀr det pÄtrÀffas i ett booleskt sammanhang. Falsy-vÀrden inkluderar:
null
undefined
0
(noll)NaN
(Not a Number)''
(tom strÀng)false
Den avgörande skillnaden Àr att nullish coalescing-operatorn endast kontrollerar för null
eller undefined
, medan OR-operatorn (||
) kontrollerar för vilket falsy-vÀrde som helst.
Skillnaden mellan ??
och ||
OR-operatorn (||
) Ă€r en logisk OR-operator som returnerar den högra operanden om den vĂ€nstra operanden Ă€r falsy. Ăven om den kan anvĂ€ndas för att tilldela standardvĂ€rden, kan den leda till ovĂ€ntat beteende nĂ€r man hanterar vĂ€rden som 0
eller en tom strÀng.
Exempel: Fallgroparna med ||
const quantity = 0 || 10; // Vi avser ett standardvÀrde pÄ 10 om quantity saknas
console.log(quantity); // Output: 10 (OvÀntat!) eftersom 0 Àr falsy
const text = '' || 'Default Text'; //Vi avser en standardtext om texten saknas
console.log(text); // Output: Default Text (OvÀntat!) eftersom '' Àr falsy
I det första exemplet avsÄg vi att tilldela en standardkvantitet pÄ 10 endast om quantity
saknades (null
eller undefined
). Men eftersom 0
Àr ett falsy-vÀrde, tilldelade OR-operatorn felaktigt standardvÀrdet. PÄ samma sÀtt gör den tomma strÀngen att standardtexten visas Àven om strÀngen finns (men Àr tom).
AnvÀnda ??
för precision
LÄt oss skriva om föregÄende exempel med nullish coalescing-operatorn:
const quantity = 0 ?? 10;
console.log(quantity); // Output: 0 (Korrekt!)
const text = '' ?? 'Default Text';
console.log(text); // Output: '' (Korrekt!)
Nu Àr resultatet som förvÀntat. Nullish coalescing-operatorn kontrollerar endast för null
eller undefined
, sÄ 0
och ''
behandlas som giltiga vÀrden, och deras ursprungliga vÀrden bevaras.
AnvÀndningsfall för Nullish Coalescing
Nullish coalescing-operatorn Àr anvÀndbar i olika scenarier dÀr du behöver tillhandahÄlla standardvÀrden endast nÀr en variabel Àr strikt null
eller undefined
. HÀr Àr nÄgra vanliga anvÀndningsfall:
1. Hantera valfria funktionsparametrar
NÀr du definierar en funktion med valfria parametrar kan du anvÀnda nullish coalescing-operatorn för att tillhandahÄlla standardvÀrden om parametrarna inte anges.
function greet(name, greeting) {
const userName = name ?? "User";
const userGreeting = greeting ?? "Hello";
console.log(`${userGreeting}, ${userName}!`);
}
greet(); // Output: Hello, User!
greet("Alice"); // Output: Hello, Alice!
greet("Bob", "Greetings"); // Output: Greetings, Bob!
2. StÀlla in standardkonfigurationsalternativ
NÀr du arbetar med konfigurationsobjekt kan du anvÀnda nullish coalescing-operatorn för att sÀkerstÀlla att standardvÀrden anvÀnds om vissa konfigurationsalternativ inte specificeras.
const config = {
timeout: 5000,
retries: 3
};
function fetchData(options) {
const timeout = options.timeout ?? 10000; // Standard-timeout pÄ 10 sekunder
const retries = options.retries ?? 5; // Standard 5 försök
console.log(`Timeout: ${timeout}, Retries: ${retries}`);
}
fetchData(config); // Output: Timeout: 5000, Retries: 3
fetchData({}); // Output: Timeout: 10000, Retries: 5
fetchData({timeout:null, retries: undefined}); // Output: Timeout: 10000, Retries: 5
3. à tkomst till nÀstlade objektegenskaper
Vid Ätkomst till egenskaper i nÀstlade objekt kan nullish coalescing-operatorn kombineras med optional chaining (?.
) för att tillhandahÄlla standardvÀrden om nÄgra av de mellanliggande egenskaperna Àr null
eller undefined
.
const user = {
profile: {
address: {
city: "New York"
}
}
};
const cityName = user?.profile?.address?.city ?? "Unknown";
console.log(cityName); // Output: New York
const unknownUser = {};
const unknownCityName = unknownUser?.profile?.address?.city ?? "Unknown";
console.log(unknownCityName); // Output: Unknown
4. Arbeta med API:er och extern data
NÀr man hÀmtar data frÄn API:er eller externa kÀllor kan nullish coalescing-operatorn anvÀndas för att tillhandahÄlla standardvÀrden om vissa datafÀlt saknas eller har null
- eller undefined
-vÀrden. TÀnk dig att hÀmta anvÀndardata frÄn olika regioner. Anta att vissa regioner kanske inte inkluderar fÀltet `country` i sina anvÀndardata.
async function getUserData(userId) {
try {
const response = await fetch(`https://api.example.com/users/${userId}`);
const data = await response.json();
const country = data.country ?? "Unknown Country";
const timezone = data.timezone ?? "UTC";
console.log(`User is from: ${country}, Timezone: ${timezone}`);
} catch (error) {
console.error("Fel vid hÀmtning av anvÀndardata:", error);
}
}
// Simulerar olika API-svar:
const userWithCountry = { name: "John", country: "USA", timezone: "EST" };
const userWithoutCountry = { name: "Jane", timezone: "GMT" };
// För att testa detta skulle du behöva ett faktiskt API eller en mock fetch.
// För demonstrationsÀndamÄl, lÄt oss simulera svaren:
global.fetch = async (url) => {
if (url.includes("123")) {
return { json: async () => userWithCountry };
} else if (url.includes("456")) {
return { json: async () => userWithoutCountry };
}
throw new Error("OvÀntad URL");
};
getUserData(123); // Output: User is from: USA, Timezone: EST
getUserData(456); // Output: User is from: Unknown Country, Timezone: GMT
Operatorprioritet
Nullish coalescing-operatorn har relativt lÄg operatorprioritet. Den Àr lÀgre Àn OR- (||
) och AND- (&&
) operatorerna. DÀrför Àr det viktigt att anvÀnda parenteser för att explicit definiera operationsordningen nÀr man kombinerar nullish coalescing-operatorn med andra logiska operatorer. Att inte göra det kan resultera i syntaxfel eller ovÀntat beteende.
Exempel: AnvÀnda parenteser för tydlighet
// Utan parenteser (SyntaxError)
// const result = false || null ?? "Default"; // SyntaxError: Unexpected token '??'
// Med parenteser (Korrekt)
const result = false || (null ?? "Default");
console.log(result); // Output: Default
const anotherResult = (false || null) ?? "Default";
console.log(anotherResult); // Output: null
I det första exemplet resulterar avsaknaden av parenteser i ett SyntaxError
eftersom JavaScript-motorn inte kan avgöra den avsedda operationsordningen. Genom att lÀgga till parenteser talar vi explicit om för motorn att utvÀrdera nullish coalescing-operatorn först. Det andra exemplet Àr giltigt; dock Àr resultatet annorlunda eftersom ||
-uttrycket utvÀrderas först.
WebblÀsarkompatibilitet
Nullish coalescing-operatorn (??
) Àr en relativt ny funktion, sÄ det Àr viktigt att tÀnka pÄ webblÀsarkompatibilitet, sÀrskilt om du riktar dig mot Àldre webblÀsare. De flesta moderna webblÀsare stöder nullish coalescing-operatorn, inklusive:
- Chrome 80+
- Firefox 72+
- Safari 13.1+
- Edge 80+
- Node.js 14+
Om du behöver stödja Àldre webblÀsare kan du anvÀnda en transpiler som Babel för att konvertera din kod till en kompatibel version av JavaScript. Babel kommer att omvandla ??
-operatorn till motsvarande JavaScript-kod som fungerar i Àldre miljöer.
BĂ€sta praxis
HÀr Àr nÄgra bÀsta praxis för att anvÀnda nullish coalescing-operatorn effektivt:
- AnvÀnd
??
för nullish-kontroller: AnvÀnd nullish coalescing-operatorn (??
) nÀr du specifikt vill tillhandahÄlla ett standardvÀrde endast nÀr en variabel Àrnull
ellerundefined
. - AnvÀnd parenteser för komplexa uttryck: NÀr du kombinerar nullish coalescing-operatorn med andra logiska operatorer, anvÀnd parenteser för att tydligt definiera operationsordningen.
- TÀnk pÄ webblÀsarkompatibilitet: Kontrollera webblÀsarkompatibilitet och anvÀnd en transpiler om det behövs för att stödja Àldre webblÀsare.
- AnvÀnd konsekvent: AnvÀnd
??
dÀr det Àr lÀmpligt för en mer förutsÀgbar kodningsstil i hela projektet. - Kombinera med optional chaining: AnvÀnd
??
tillsammans med optional chaining?.
för att sÀkert komma Ät och tilldela standardvÀrden till nÀstlade egenskaper i objekt.
Globala övervÀganden
NÀr du utvecklar för en global publik, tÀnk pÄ följande punkter relaterade till tilldelning av standardvÀrden:
- Lokalisering: StandardvÀrden kan behöva lokaliseras baserat pÄ anvÀndarens sprÄk eller region. Till exempel en standardvalutasymbol eller ett datumformat.
- Kulturella normer: Vissa standardvÀrden kan behöva justeras baserat pÄ kulturella normer. Till exempel kan ett standardhÀlsningsmeddelande behöva vara annorlunda i olika kulturer.
- TillgÀnglighet: Se till att standardvÀrden Àr tillgÀngliga och förstÄeliga för anvÀndare med funktionsnedsÀttningar. TillhandahÄll tydliga och beskrivande etiketter för standardvÀrden i anvÀndargrÀnssnitt.
- Tidszoner och datum: NÀr du arbetar med datum och tider, anvÀnd lÀmpliga tidszoner och datumformat för att sÀkerstÀlla att standardvÀrden visas korrekt för anvÀndare i olika regioner.
Exempel: Lokalisering med Nullish Coalescing
LÄt oss sÀga att du vill visa ett standardvÀlkomstmeddelande pÄ olika sprÄk baserat pÄ anvÀndarens sprÄkkod. Du kan anvÀnda nullish coalescing-operatorn för att tillhandahÄlla ett standardmeddelande om ett lokaliserat meddelande inte Àr tillgÀngligt.
function getWelcomeMessage(locale) {
const localizedMessages = {
en: "Welcome!",
fr: "Bienvenue !",
de: "Willkommen!"
};
const message = localizedMessages[locale] ?? "Welcome!"; // AnvÀnder engelska som standard om sprÄkkoden inte hittas
return message;
}
console.log(getWelcomeMessage("fr")); // Output: Bienvenue !
console.log(getWelcomeMessage("es")); // Output: Welcome! (StandardinstÀllning till engelska)
Slutsats
Nullish coalescing-operatorn (??
) Àr ett vÀrdefullt tillskott till JavaScript-sprÄket. Den erbjuder ett mer precist och tillförlitligt sÀtt att tilldela standardvÀrden jÀmfört med OR-operatorn (||
), sÀrskilt nÀr man hanterar vÀrden som 0
eller tomma strÀngar. Genom att förstÄ dess syntax, beteende och anvÀndningsfall kan du skriva renare, mer underhÄllbar kod som korrekt hanterar tilldelning av standardvÀrden. Kom ihÄg att övervÀga webblÀsarkompatibilitet, operatorprioritet och globala aspekter nÀr du anvÀnder nullish coalescing-operatorn i dina projekt.
Genom att följa de bÀsta praxis som beskrivs i den hÀr guiden kan du effektivt utnyttja nullish coalescing-operatorn för att förbÀttra kvaliteten och tillförlitligheten i din JavaScript-kod, vilket gör den mer robust och lÀttare att förstÄ. Kom ihÄg att alltid prioritera tydlighet och underhÄllbarhet i din kod, och nullish coalescing-operatorn kan vara ett kraftfullt verktyg för att uppnÄ dessa mÄl.